home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / tech.ntf < prev    next >
Encoding:
Text File  |  1994-10-08  |  3.8 KB  |  142 lines

  1. .so @pri.ntf
  2. .so @orm.ntf
  3. .article_style
  4. .printform A4 BUSY
  5. .title GUIライブラリ・小テクニック(1)
  6. .title (ウィンドウの子部品を再配置
  7. .title するときの記述テクニック)
  8. .author 松内 良介
  9. .maketitle
  10.  
  11. .chapter ウィンドウのリサイズの記述は面倒 (~^T)
  12.  GUIライブラリを利用していて、
  13. ウィンドウがリサイズされたときのスクロールバーの位置・
  14. 大きさ調整の記述を面倒に思ったことはありませんか?
  15. その面倒さは、一般的に言えば、「ウィンドウ上に置かれた部品を再配置する
  16. 処理の記述の面倒さ」です。
  17. この面倒さに対して、私が個人的に実践している対処方法を紹介します
  18. (単なるコーディングテクニックに過ぎないのですが……)。
  19.  
  20. .chapter ウィンドウ上の部品の位置・大きさの決め方
  21.  スクロールバーの場合なら、スクロールバーの表示枠(HYPER型の fr メンバ)は、次のように決まるのが普通です。
  22.  
  23.  
  24.  「ウィンドウの右端(または下端)
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.     void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
  32.     {
  33.         HYPER hyp, hypBase;
  34.         MMI_SendMessage(kobj, MM_GETHYPER, 1, &hyp);
  35.         MMI_SendMessage(baseobj, MM_GETHYPER, 1, &hypBase);
  36.         #define    DO(t1, t2, t3)                                \
  37.             if (parm->t1 >= 0)                                \
  38.                 hyp.fr.t1 = hypBase.fr.t2 + parm->t1;        \
  39.             else                                            \
  40.                 hyp.fr.t1 = hypBase.fr.t3 + 1 + parm->t1;
  41.         DO(lupx, lupx, rdwx)
  42.         DO(lupy, lupy, rdwy)
  43.         DO(rdwx, lupx, rdwx)
  44.         DO(rdwy, lupy, rdwy)
  45.         #undef DO
  46.         MMI_SendMessage(kobj, MM_SETHYPER, 1, &hyp);
  47.     }
  48.  
  49.     void RM_adjustWinUser(int idWin, FRAME *parm)
  50.     {
  51.         HYPER hyp;
  52.         FRAME frUser, frResize;
  53.         MMI_SendMessage(idWin, MM_GETHYPER, 1, &hyp);
  54.         MMI_SendMessage(idWin, MM_GETUSER, 2, &frUser, &frResize);
  55.         #define    DO(t1, t2, t3)                            \
  56.             if (parm->t1 >= 0)                            \
  57.                 frUser.t1 = hyp.fr.t2 + parm->t1;        \
  58.             else                                        \
  59.                 frUser.t1 = hyp.fr.t3 + 1 + parm->t1;
  60.         DO(lupx, lupx, rdwx)
  61.         DO(lupy, lupy, rdwy)
  62.         DO(rdwx, lupx, rdwx)
  63.         DO(rdwy, lupy, rdwy)
  64.         #undef DO
  65.         frUser.rdwx = frUser.rdwx - frUser.lupx + 1;
  66.         frUser.rdwy = frUser.rdwy - frUser.lupy + 1;
  67.         frUser.lupx = frUser.lupx - hyp.fr.lupx;
  68.         frUser.lupy = frUser.lupy - hyp.fr.lupy;
  69.         MMI_SendMessage(idWin, MM_SETUSER, 1, &frUser, &frResize);
  70.     }
  71.  
  72.  
  73.  
  74.  
  75.     static void AdjustImageStoreWin(int side)
  76.     {
  77.         RM_adjustFrame(idImageStoreTitleDBtn[side], idImageStoreWin[side],
  78.                        &frAdjTitleDBtn);
  79.         RM_adjustFrame(idImageStoreSBarV[side], idImageStoreWin[side],
  80.                        &frAdjSBarV);
  81.         RM_adjustFrame(idImageStoreEditMenuDBtn[side], idImageStoreWin[side],
  82.                        &frAdjEditMenuDBtn);
  83.         int i;
  84.         for (i=0; i<3; i++)
  85.         {
  86.             RM_adjustFrame(idImageStoreEditDBtn[side][i],idImageStoreWin[side],
  87.                            &frAdjEditDBtn[i]);
  88.             RM_adjustFrame(idImageStoreEditMsg[side][i],idImageStoreWin[side],
  89.                            &frAdjEditDBtn[i]);
  90.         }
  91.         RM_adjustWinUser(idImageStoreWin[side], &frAdjWinUser);
  92.     }
  93.  
  94.     int init_imstore(void)
  95.     {
  96.         int i;
  97.         for (i=0; i<2; i++)
  98.         {
  99.             AdjustImageStoreWin(i);
  100.             swin[i].plImage = list_new(sizeof(SIMAGE*));
  101.             swin[i].idWin   = idImageStoreWin[i];
  102.             swin[i].idSBarV = idImageStoreSBarV[i];
  103.             setSBarImageList(&swin[i], FALSE);
  104.         }
  105.         return 0;
  106.     }
  107.  
  108.     /*    initDataZIMSTORE:idImageStoreWin[1]:MJ_WINDOWL40の呼び出し関数    */
  109.     int    ImageStoreWinFunc(kobj, messId, argc, pev, trigger)
  110.     int        kobj ;
  111.     int        messId ;
  112.     int        argc ;
  113.     EVENT    *pev ;
  114.     int        trigger ;
  115.     {
  116.         int side;
  117.         if (kobj == idImageStoreWin[0])
  118.             side = 0;
  119.         else
  120.             side = 1;
  121.         if (messId == MM_SHOW)
  122.             dispImageList(&swin[side]);
  123.         else if (messId == MM_UPDATE)
  124.         {
  125.             AdjustImageStoreWin(side);
  126.             setSBarImageList(&swin[side], TRUE);
  127.         }
  128.         else if (messId == MM_MOVE)
  129.         {
  130.             RM_roundFramePosition(swin[side].idWin, 2,2);
  131.             dispImageList(&swin[side]);
  132.         }
  133.         else if (messId == MM_MOUSEON)
  134.         {
  135.             imstore_WinUserMouseOn(side, swin[side].plImage, pev);
  136.             dispImageList(&swin[side]);
  137.             // printf("ImageStoreWinFunc: %d %d\n",t,n);
  138.         }
  139.         return NOERR ;
  140.     }
  141.  
  142.